'\" te
.\"  Copyright (c) 2005 Sun Microsystems, Inc. All Rights Reserved
.\" The contents of this file are subject to the terms of the Common Development and Distribution License (the "License").  You may not use this file except in compliance with the License.
.\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE or http://www.opensolaris.org/os/licensing.  See the License for the specific language governing permissions and limitations under the License.
.\" When distributing Covered Code, include this CDDL HEADER in each file and include the License file at usr/src/OPENSOLARIS.LICENSE.  If applicable, add the following below this CDDL HEADER, with the fields enclosed by brackets "[]" replaced with your own identifying information: Portions Copyright [yyyy] [name of copyright owner]
.TH PCI 5 "May 13, 2017"
.SH NAME
pci, pcie \- configuration files for PCI and PCI Express device drivers
.SH DESCRIPTION
.LP
The Peripheral Component Interconnect (PCI) bus is a little endian bus. PCI
Express (PCIe) and PCI-X are successors to PCI. All three types of devices
share the same configuration parameters. What is specified here for PCI devices
applies to PCI-X 1.0 devices as well. All three types of devices are
self-identifying, which means that these devices provide configuration
parameters to the system that allow the system to identify the device and its
driver. The configuration parameters are represented in the form of name-value
pairs that can be retrieved using the \fBDDI\fR property interfaces. See
\fBddi_prop_lookup\fR(9F) for details.
.sp
.LP
The bus properties of PCI devices or logical bus properties of PCIe devices are
derived from PCI configuration space, or supplied by the Fcode \fBPROM\fR, if
it exists. Therefore, driver configuration files are not necessary for these
devices.
.sp
.LP
On some occasions, drivers for \fBPCI\fR and PCIe devices can use driver
configuration files to provide driver private properties through the global
property mechanism. See \fBdriver.conf\fR(5) for further details. Driver
configuration files can also be used to augment or override properties for a
specific instance of a driver.
.sp
.LP
All bus drivers of PCI and PCIe devices recognize the following properties:
.sp
.ne 2
.na
\fB\fBreg\fR\fR
.ad
.RS 14n
An arbitrary length array where each element of the array consists of a 5-tuple
of 32-bit values. Each array element describes a logically contiguous mappable
resource on the \fBPCI\fR bus or PCIe device tree.
.sp
The first three values in the 5-tuple describe the \fBPCI\fR address of the
mappable resource. The first tuple contains the following information:
.sp

.sp
.TS
l l l
l l l .
Bits 0 - 7	8-bit register number	
Bits 8 - 10	3-bit function number	
Bits 11 - 15	5-bit device number	
Bits 16 - 23 	8-bit bus number	
Bits 24 - 25	2-bit address space type identifier	
Bits 31 - 28	T{
Register number extended bits 8:11 for extended config space. Zero for conventional configuration space.
T}	
.TE

The address space type identifier can be interpreted as follows:
.sp

.sp
.TS
l l l
l l l .
0x0	configuration space	
0x1	I/O space	
0x2	32-bit memory space address	
0x3	64-bit memory space address	
.TE

The bus number is a unique identifying number assigned to each \fBPCI\fR bus or
PCIe logical bus within its domain.
.sp
The device number is a unique identifying number assigned to each device on a
\fBPCI\fR bus or PCIe logical bus. Note that a device number is unique only
within the set of device numbers for a particular bus or logical bus.
.sp
Each \fBPCI\fR or PCIe device can have one to eight logically independent
functions, each with its own independent set of configuration registers. Each
function on a device is assigned a function number. For a device with only one
function, the function number must be \fB0\fR.
.sp
The register number fields select a particular register within the set of
configuration registers corresponding to the selected function. When the
address space type identifier indicates configuration space, non-zero register
number extended bits select registers in extended configuration space.
.sp
The second and third values in the \fBreg\fR property 5-tuple specify the
64-bit address of the mappable resource within the \fBPCI\fR or PCIe address
domain. The second 32-bit tuple corresponds to the high order four bytes of the
64-bit address. The third 32-bit tuple corresponds to the low order bytes.
.sp
The fourth and fifth 32-bit values in the 5-tuple \fBreg\fR property specify
the size of the mappable resource. The size is a 64-bit value, where the fourth
tuple corresponds to the high order bytes of the 64-bit size and the fifth
corresponds to the low order.
.sp
The driver can refer to the elements of this array by index, and construct
kernel mappings to these addresses using \fBddi_regs_map_setup\fR(9F). The
index into the array is passed as the \fIrnumber\fR argument of
\fBddi_regs_map_setup\fR(9F).
.sp
At a high-level interrupt context, you can use the \fBddi_get*\fR and
\fBddi_put*\fR family of functions to access I/O and memory space. However,
access to configuration space is not allowed when running at a high-interrupt
level.
.RE

.sp
.ne 2
.na
\fB\fBinterrupts\fR\fR
.ad
.RS 14n
This property consists of a single-integer element array. Valid interrupt
property values are \fB1\fR, \fB2\fR, \fB3\fR, and \fB4\fR. This value is
derived directly from the contents of the device's configuration-interrupt-pin
register.
.sp
A driver should use an index value of \fB0\fR when registering its interrupt
handler with the DDI interrupt interfaces.
.RE

.sp
.LP
All \fBPCI\fR and PCIe devices support the \fBreg\fR property. The device
number and function number as derived from the \fBreg\fR property are used to
construct the address part of the device name under \fB/devices\fR.
.sp
.LP
Only devices that generate interrupts support an \fBinterrupts\fR property.
.sp
.LP
Occasionally it might be necessary to override or augment the configuration
information supplied by a \fBPCI\fR or PCIe device. This change can be achieved
by writing a driver configuration file that describes a prototype device node
specification containing the additional properties required.
.sp
.LP
For the system to merge the prototype node specification into an actual device
node, certain conditions must be met.
.RS +4
.TP
.ie t \(bu
.el o
First, the \fBname\fR property must be identical. The value of the \fBname\fR
property needs to match the binding name of the device. The binding name is the
name chosen by the system to bind a driver to a device and is either an alias
associated with the driver or the hardware node name of the device.
.RE
.RS +4
.TP
.ie t \(bu
.el o
Second, the parent property must identify the PCI bus or PCIe logical bus.
.RE
.RS +4
.TP
.ie t \(bu
.el o
Third, the unit-address property must identify the card. The format of the
unit-address property is:
.RE
.sp
.LP
\fBDD[,F]\fR
.sp
.LP
where \fBDD\fR is the device number and \fBF\fR is the function number. If the
function number is 0, only \fBDD\fR is specified.
.SH EXAMPLES
.LP
\fBExample 1 \fRSample Configuration File
.sp
.LP
An example configuration file called \fBACME,scsi-hba.conf\fR for a \fBPCI\fR
driver called \fBACME,scsi-hba\fR follows:

.sp
.in +2
.nf
#
# Copyright (c) 1995, ACME SCSI Host Bus Adaptor
# ident   "@(#)ACME,scsi-hba.conf  1.1  96/02/04"
name="ACME,scsi-hba" parent="/pci@1,0/pci@1f,4000"
   unit-address="3" scsi-initiator-id=6;
hba-advanced-mode="on";
hba-dma-speed=10;
.fi
.in -2
.sp

.sp
.LP
In this example, a property \fBscsi-initiator-id\fR specifies the \fBSCSI\fR
bus initiator id that the adapter should use, for just one particular instance
of adapter installed in the machine. The \fBname\fR property identifies the
driver and the parent property to identify the particular bus the card is
plugged into. This example uses the parent's full path name to identify the
bus. The unit-address property identifies the card itself, with device number
of 3 and function number of 0.

.sp
.LP
Two global driver properties are also created: \fBhba-advanced-mode\fR (which
has the string value \fBon\fR) and \fBhba-dma-speed\fR (which has the value
\fB10\fR M bit/s). These properties apply to all device nodes of the
\fBACME,scsi-hba\fR.

.sp
.LP
Configuration files for PCIe devices are similar. Shown below is an example
configuration file called \fBACME,pcie-widget.conf\fR for a PCIe driver called
\fBACME,pcie-widget\fR.

.sp
.in +2
.nf
#
# Copyright (c) 2005, ACME PCIe Widget Adapter
# ident   "@(#)ACME,pcie-widget.conf  1.1  05/11/14"
name="ACME,pcie-widget" parent="/pci@780" unit-address="2,1"
debug-mode=12;
.fi
.in -2
.sp

.sp
.LP
In this example, we provide a property \fBdebug-mode\fR for a particular PCIe
device. As before, the logical bus is identified by the pathname of the parent
of the device. The device has a device number of 2, and a function number of 1.

.SH ATTRIBUTES
.LP
See \fBattributes\fR(7) for descriptions of the following attributes:
.sp

.sp
.TS
box;
c | c
l | l .
ATTRIBUTE TYPE	ATTRIBUTE VALUE
_
Architecture	SPARC, x86
.TE

.SH SEE ALSO
.LP
.BR driver.conf (5),
.BR attributes (7),
.BR ddi_intr_add_handler (9F),
.BR ddi_prop_lookup (9F),
.BR ddi_regs_map_setup (9F)
.sp
.LP
\fIWriting Device Drivers\fR
.sp
.LP
\fIIEEE 1275 PCI Bus Binding\fR
.SH NOTES
.LP
PCIe devices support an extended configuration space unavailable to PCI
devices. While PCIe devices can be operated using a PCI device driver,
operating them using a PCIe device driver can make use of the extended
properties and features made available only in the extended configuration
space.
